package br.com.bancoeXtreme;

import controle.Frame;
import java.io.*;
import java.net.*;
public class ServidorSocketExemplo{
	ServerSocket providerSocket; // Servidor
	Socket connection = null; // Conexão à qual o cliente deverá conectarse
	ObjectOutputStream out; // Fluxo de saída de dados
	ObjectInputStream in; // Fluxo de entrada de dados
	Frame message; // Mensagem


	ServidorSocketExemplo(){}

        void run()
        {
		try{
			//1. Criação do ServerSocket
			providerSocket = new ServerSocket(2004);

                        //2. Aguarda por uma conexão
			System.out.println("Aguardando por uma conexão na porta 2004");
			connection = providerSocket.accept();
			System.out.println("Conexão recebida " + connection.getInetAddress().getHostName());

                        //3. Obtém fluxos de entrada e saída
			out = new ObjectOutputStream(connection.getOutputStream());
			out.flush(); // descarrega o buffer

                        // Envia mensagem de sucesso de conexão.
			in = new ObjectInputStream(connection.getInputStream());
			sendMessage("Conexão estabelecida com sucesso!");
			//4. As parte envolvidas trocam mensagens
			do{
				try{
                                        // Le mensagem recebida
					// Minhas mudanças começam aqui
                                        //message = (String)in.readObject(); *antigo
                                        message = (Frame)in.readObject();
                                        System.out.println("Mensagem codificada recebida: " + message.getCodMessage());
                                        message.hammingDecode();
                                        System.out.println("Mensagem decodificada:\nCliente>" + message.getDecMessage());

                                        // Envia mensagem
					if (message.isFim())
                                            sendMessage("Despedida enviada pelo Servidor");
				}
				catch(ClassNotFoundException classnot){
					System.err.println("Dados não recebidos corretamente");
				}
			}while(!message.isFim());
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
		finally{
			//4: Fechando a conexão
			try{
				in.close(); // Fecha o fluxo de entrada
				out.close(); // Fecha o fluxo de saída                               
				providerSocket.close(); // Fecha conexão do servidor
			}
			catch(IOException ioException){
				ioException.printStackTrace();
			}
		}
	}
	void sendMessage(String msg)
	{
		try{
			out.writeObject(msg);
			out.flush();
			System.out.println("Servidor>" + msg);
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
	}
	public static void main(String args[])
	{
		ServidorSocketExemplo server = new ServidorSocketExemplo();
		while(true){
			server.run();
		}
	}
}
